package reflection;



import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author oyz
 * @version 1.0.4
 * @description: 测试学生类的反射
 * @date 2023/2/22 20:53
 */
public class TestStudent {



    /**
     * @description: 获取class类
     * @author oyz
     * @date 2023/2/22 21:14
     */
    public void getClassObject() throws Exception{
        // 第一种方式 通过类的路径名
        Class<?> aClass = Class.forName("reflection.Student");
        System.out.println(aClass);
        Student o = (Student) aClass.newInstance();
        System.out.println(o);
        // 第二种方式  通过类名，在代码编译时就已经拿到
        Class<Student> studentClass = Student.class;
        // 第三种方式 通过类的实例获取，需要在程序运行时才能拿到
        Student student = new Student();
        Class<? extends Student> aClass1 = student.getClass();
        // 好消息是java运行的时候，这三种方式生成的类地址值是一样的
    }



    /**
     * @description: 获取成员变量
     * @author oyz
     * @date 2023/2/22 21:15
     */
    public void getField() throws Exception{
        Class<?> aClass = Class.forName("reflection.Student");
        // 获取所有的共有字段
        Field[] fields = aClass.getFields();
        for (Field field : fields) {
            System.out.println("field:"+field);
        }
        // 获取所有申明的字段
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("declaredField:"+declaredField);
        }
    }


    public void getConstructor() throws Exception{
        Class<?> aClass = Class.forName("reflection.Student");
        // 获取公有构造
        Constructor<?>[] constructors = aClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println("constructor:"+constructor);
        }
        // 获取所有声明的构造
        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println("declaredConstructor:"+declaredConstructor);
        }
    }

    public void getMethod() throws Exception {
        Class<?> aClass = Class.forName("reflection.Student");
        // 获取所有公共的方法,包括父类object的方法
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            System.out.println("publicMethod:"+ method);
        }
        System.out.println("-----------------------------------------");
        // 获取所有的声明的方法，只包括他自身
        Method[] declaredMethods = aClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("declaredMethod"+ declaredMethod);
        }

    }


    public static void main(String[] args)  throws Exception{

        TestStudent testStudent = new TestStudent();
        testStudent.getField();
        System.out.println("\n");
        testStudent.getConstructor();
        System.out.println("\n");
        testStudent.getMethod();

    }


}
